package com.sixmac.utils;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by junxia_zhao
 */
public class likeWikeUtil {

    /**
     * 默认地球半径
     */

    private static double EARTH_RADIUS = 6371;
    /**
     * 距离2千米
     */

    private static double distance = 2;

    /**
     * 计算经纬度点对应正方形4个点的坐标
     *
     * @param longitude 经度
     * @param latitude  纬度
     * @return
     */

    public static Map<String, double[]> returnLLSquarePoint(double longitude,

                                                            double latitude) {

        Map<String, double[]> squareMap = new HashMap<>();

        // 计算经度弧度,从弧度转换为角度

        double dLongitude = 2 * (Math.asin(Math.sin(distance

                / (2 * EARTH_RADIUS))

                / Math.cos(Math.toRadians(latitude))));

        dLongitude = Math.toDegrees(dLongitude);

        // 计算纬度角度

        double dLatitude = distance / EARTH_RADIUS;

        dLatitude = Math.toDegrees(dLatitude);

        // 正方形

        double[] leftTopPoint = {latitude + dLatitude, longitude - dLongitude};

        double[] rightTopPoint = {latitude + dLatitude, longitude + dLongitude};

        double[] leftBottomPoint = {latitude - dLatitude,

                longitude - dLongitude};

        double[] rightBottomPoint = {latitude - dLatitude,

                longitude + dLongitude};

        squareMap.put("leftTopPoint", leftTopPoint);

        squareMap.put("rightTopPoint", rightTopPoint);

        squareMap.put("leftBottomPoint", leftBottomPoint);

        squareMap.put("rightBottomPoint", rightBottomPoint);

        return squareMap;
    }

    /**
     * @param latitue     待测点的纬度
     * @param longitude   待测点的经度
     * @param myLatitude  前台传的纬度
     * @param myLongitude 前台传的经度
     * @return
     */

    public static boolean isInArea(double myLatitude, double myLongitude, double latitue, double longitude) {
        Map<String, double[]> map = returnLLSquarePoint(myLongitude, myLatitude);
        double[] leftTop = map.get("leftTopPoint");
        double[] rightTop = map.get("rightTopPoint");
        double[] leftBottom = map.get("leftBottomPoint");
        //下面是经纬度的范围 areaLongitude1最小经度 areaLongitude2最大经度 areaLatitude1最小纬度 areaLatitude2 最大纬度
        double areaLongitude1 = rightTop[1];
        double areaLongitude2 = leftTop[1];
        double areaLatitude1 = leftBottom[0];
        double areaLatitude2 = leftTop[0];
        if (isInRange(latitue, areaLatitude1, areaLatitude2)) {//如果在纬度的范围内
            if (areaLongitude1 * areaLongitude2 > 0) {//如果都在东半球或者都在西半球
                if (isInRange(longitude, areaLongitude1, areaLongitude2)) {
                    return true;
                } else {
                    return false;
                }
            } else {//如果一个在东半球，一个在西半球
                if (Math.abs(areaLongitude1) + Math.abs(areaLongitude2) < 180) {//如果跨越0度经线在半圆的范围内
                    if (isInRange(longitude, areaLongitude1, areaLongitude2)) {
                        return true;
                    } else {
                        return false;
                    }
                } else {//如果跨越180度经线在半圆范围内
                    double left = Math.max(areaLongitude1, areaLongitude2);//东半球的经度范围left-180
                    double right = Math.min(areaLongitude1, areaLongitude2);//西半球的经度范围right-（-180）
                    if (isInRange(longitude, left, 180) || isInRange(longitude, right, -180)) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }
        } else {
            return false;
        }
    }

    public static boolean isInRange(double point, double left, double right) {
        if (point >= Math.min(left, right) && point <= Math.max(left, right)) {
            return true;
        } else {
            return false;
        }

    }

    public static void main(String[] arg) {

        // 前台传过来的
        double myLongitude = 114.001;//待测点的经度
        double myLatitude = 29.97;//待测点的纬度
        // 数据库里的
        double Longitude = 114;//待测点的经度
        double Latitude = 29.96;//待测点的纬度

        if (isInArea(myLatitude, myLongitude, Latitude, Longitude)) {
            System.out.println("在范围内");
        } else {
            System.out.println("不在范围内");
        }

    }

}
